AWS Step Functionsの実行完了をAWS Chatbotを使っていい感じにSlackに通知する

AWS Step Functionsの実行完了をAWS Chatbotを使っていい感じにSlackに通知する

こんにちは。サービスグループの武田です。AWS ChatbotがAmazon EventBridgeイベントに対応したことで利用の幅が一気に広がりましたね。今回はその中からAWS Step Functionsの通知を試してみました。
Clock Icon2022.02.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

2022年10月15日頃からこの方法では正しく動作しません。
Incoming Webhookを使用してAWS Step Functionsの実行結果をSlackに通知するを参照してください。

こんにちは。サービスグループの武田です。

AWS ChatbotがAmazon EventBridgeイベントに対応したことで利用の幅が一気に広がりましたね。今回はその中からAWS Step Functionsの通知を試してみました。

ちなみに前回はAmazon ECRの通知を試しました。よければそちらもご覧ください。

まずは通知される内容を確認してみる

Chatbot、SNSトピックの設定は共通ですので、ちゃだいんのエントリを参考にしてください。

EventBridgeとSNSを連携されるイベントパターンは次のように定義しました。明示的に省いているのはRUNNINGです。実行スタート時にも通知したいのであれば、detailを省略すればすべてのステータス変更が対象となります。

{
  "source": ["aws.states"],
  "detailType": ["Step Functions Execution Status Change"],
  "detail": {
    "status": ["SUCCEEDED", "FAILED", "TIMED_OUT", "ABORTED"]
  }
}

EventBridgeに通知される内容を引用しておきます。これは成功時のものです。

{
    "version": "0",
    "id": "315c1398-40ff-a850-213b-158f73e60175",
    "detail-type": "Step Functions Execution Status Change",
    "source": "aws.states",
    "account": "012345678912",
    "time": "2019-02-26T19:42:21Z",
    "region": "us-east-1",
    "resources": [
      "arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name"
    ],
    "detail": {
        "executionArn": "arn:aws:states:us-east-1:012345678912:execution:state-machine-name:execution-name",
        "stateMachineArn": "arn:aws:states:us-east-1:012345678912:stateMachine:state-machine",
        "name": "execution-name",
        "status": "SUCCEEDED",
        "startDate": 1547148840101,
        "stopDate": 1547148840122,
        "input": "{}",
        "inputDetails": {
             "included": true
        },
        "output": "\"Hello World!\"",
        "outputDetails": {
             "included": true
        }
    }
}

Step Functions 実行ステータス変更用 EventBridge (CloudWatch Events) - AWS Step Functions

あとは検証に使用する適当なステートマシンを用意します。今回はマネジメントコンソールからデフォルトで用意されているHello Worldのステートマシンを作成しました。

それではこのステートマシンを実行し、Slackへ通知された内容を確認してみます。

うーん、ちょっと情報量が少ないですね……。成功か失敗かもわかりませんし、詳細を確認するリンクも欲しいところです。

入力トランスフォーマーを使用して通知内容をカスタマイズする

デフォルトの通知内容では情報量が少ないため、EventBridgeの入力トランスフォーマーを使用して、通知内容をカスタマイズしてみましょう。

マネジメントコンソールのEventBridgeのページで、[ルールを編集]→[ターゲットを選択]→[入力の設定]と移動します。

入力トランスフォーマーは 入力パス入力テンプレート に分かれています。入力パスでは入力テンプレートで使用したい変数を定義します。実際に渡される内容は入力テンプレートに定義します。今回はそれぞれ次のように定義しました。

こちらは入力パス。EventBridgeに渡される値からJSONパスを使って変数を定義しています。

{
    "account": "$.account",
    "detail-executionArn": "$.detail.executionArn",
    "detail-input": "$.detail.input",
    "detail-name": "$.detail.name",
    "detail-status": "$.detail.status",
    "detail-type": "$.detail-type",
    "id": "$.id",
    "region": "$.region",
    "source": "$.source",
    "time": "$.time",
    "version": "$.version"
}

続いて入力テンプレート。ほとんどが再定義しているだけですが、detail-typeresourcesを変えています。試行錯誤してみたところ、detail以外のフィールドは削ってはダメなようです。

{
    "version": <version>,
    "id": <id>,
    "detail-type": "[<detail-status>] <detail-type>",
    "source": <source>,
    "account": <account>,
    "time": <time>,
    "region": <region>,
    "resources": [
        "https://<region>.console.aws.amazon.com/states/home?region=<region>#/executions/details/<detail-executionArn>",<detail-input>
    ]
}

これらを定義したうえでもう一度ステートマシンを実行してみます。通知された内容は次のもの。

SUCCEEDEDとステータスがわかります。また詳細を確認するためのリンクもきちんと通知されていますね。どうやらdetail-typeが通知のタイトルに、resourcesの内容がリストとして表示されるようです。これを元にすれば通知に出したい内容(今回はリンクと入力パラメーター)を好きにカスタマイズできそうですね。

まとめ

Step Functionsの実行完了をSlackに通知させてみました。デフォルトの内容では少々物足りないものでしたが、入力トランスフォーマーを使用すればカバーできそうです。

ちなみにタイトル部分をマネジメントコンソールのリンクにしようとしてみましたが、こちらは断念しました。成功した方はやり方を教えてください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.